package com.zkt.subject.application.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.zkt.subject.application.convert.SubjectLabelDTOConverter;
import com.zkt.subject.entity.SubjectLabelDTO;
import com.zkt.subject.common.entity.Result;
import com.zkt.subject.domain.entity.SubjectLabelBO;
import com.zkt.subject.domain.service.SubjectLabelDomainService;
import com.zkt.subject.infra.entity.UserInfo;
import com.zkt.subject.infra.rpc.UserRPC;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 赵开泰
 * @program jc-club
 * @date 2024/10/4
 * @description 题目标签的controller
 **/

@RestController
@RequestMapping("/label")
@Slf4j
public class SubjectLabelController {
	
	@Resource
	private SubjectLabelDomainService subjectLabelDomainService;
	
	@Resource
	private UserRPC userRPC;
	
	@GetMapping("test")
	public void test(@RequestParam(value = "username", required = false) String username) {
		UserInfo userInfo = userRPC.getUserInfo(username);
		log.info("userInfo:{}", JSON.toJSONString(userInfo));
	}
	
	/**
	 * 新增标签
	 *
	 * @param subjectLabelDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("add")
	public Result<Boolean> add(@RequestBody SubjectLabelDTO subjectLabelDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectLabelController.add.dto:{}", JSON.toJSONString(subjectLabelDTO));
			}
			
			if (StrUtil.isEmpty(subjectLabelDTO.getLabelName())) {
				throw new Exception("标签的名称不能为空");
			}
			
			if (ObjectUtil.isEmpty(subjectLabelDTO.getCategoryId())) {
				throw new Exception("标签的分类不能为空");
			}
			
			SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE
					.convertDtoToBo(subjectLabelDTO);
			Boolean result = subjectLabelDomainService.add(subjectLabelBO);
			return Result.ok(result);
		} catch (Exception e) {
			log.error("SubjectLabelController.add.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
	/**
	 * 更新标签
	 *
	 * @param subjectLabelDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("update")
	public Result<Boolean> update(@RequestBody SubjectLabelDTO subjectLabelDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectLabelController.update.dto:{}", JSON.toJSONString(subjectLabelDTO));
			}
			
			if (ObjectUtil.isNull(subjectLabelDTO.getId())) {
				throw new Exception("标签的id不能为空");
			}
			
			SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE
					.convertDtoToBo(subjectLabelDTO);
			Boolean result = subjectLabelDomainService.update(subjectLabelBO);
			return Result.ok(result);
		} catch (Exception e) {
			log.error("SubjectLabelController.update.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
	/**
	 * 删除标签
	 *
	 * @param subjectLabelDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("delete")
	public Result<Boolean> delete(@RequestBody SubjectLabelDTO subjectLabelDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectLabelController.delete.dto:{}", JSON.toJSONString(subjectLabelDTO));
			}
			
			if (ObjectUtil.isNull(subjectLabelDTO.getId())) {
				throw new Exception("标签的id不能为空");
			}
			
			SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE
					.convertDtoToBo(subjectLabelDTO);
			Boolean result = subjectLabelDomainService.delete(subjectLabelBO);
			return Result.ok(result);
		} catch (Exception e) {
			log.error("SubjectLabelController.delete.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
	/**
	 * 根据分类查询标签
	 *
	 * @param subjectLabelDTO 请求参数
	 * @return 成功与否
	 */
	@PostMapping("queryLabelByCategoryId")
	public Result<List<SubjectLabelDTO>> queryLabelByCategoryId(@RequestBody SubjectLabelDTO subjectLabelDTO) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectLabelController.queryLabelByCategoryId.dto:{}", JSON.toJSONString(subjectLabelDTO));
			}
			
			SubjectLabelBO subjectLabelBO = SubjectLabelDTOConverter.INSTANCE
					.convertDtoToBo(subjectLabelDTO);
			List<SubjectLabelBO> subjectLabelBOList = subjectLabelDomainService.queryLabelByCategoryId(subjectLabelBO);
			return Result.ok(SubjectLabelDTOConverter.INSTANCE.convertBoToDto(subjectLabelBOList));
		} catch (Exception e) {
			log.error("SubjectLabelController.queryLabelByCategoryId.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
	/**
	 * 根据id查询标签
	 *
	 * @param subjectLabelIds id列表
	 * @return 成功与否
	 */
	@GetMapping("queryLabelByIds")
	public Result<List<SubjectLabelDTO>> queryLabelByIds(@RequestParam("subjectLabelIds") List<Long> subjectLabelIds) {
		try {
			if (log.isInfoEnabled()) {
				log.info("SubjectLabelController.queryLabelByIds.subjectLabelIds:{}", JSON.toJSONString(subjectLabelIds));
			}
			
			if (CollUtil.isEmpty(subjectLabelIds)) {
				throw new Exception("分类的id不能为空");
			}
			
			List<SubjectLabelBO> subjectLabelBOList = subjectLabelDomainService.queryLabelByIds(subjectLabelIds);
			
			return Result.ok(SubjectLabelDTOConverter.INSTANCE.convertBoToDto(subjectLabelBOList));
		} catch (Exception e) {
			log.error("SubjectLabelController.queryLabelByIds.error:{}", e.getMessage(), e);
			return Result.fail(e.getMessage());
		}
	}
	
}